home *** CD-ROM | disk | FTP | other *** search
/ CU Amiga Super CD-ROM 27 / CU Amiga Magazine's Super CD-ROM 27 (1998)(EMAP Images)(GB)[!][issue 1998-10].iso / CUCD / Programming / rxlistview / rxlistview next >
Text File  |  1998-08-15  |  8KB  |  240 lines

  1. RXLV_HELP: procedure 
  2. /* Help stuff here */
  3. return
  4.  
  5. RXLV_MAIN: procedure expose viewline. rxlv.
  6. parse arg titletxt, inlinechars
  7.  
  8. /* Reset key */
  9. rxlv.key = ''
  10.  
  11. /* Which is bigger - win rows or lines in stemvar? */
  12. if rxlv.disprows > viewline.0 then rxlv.actrows = viewline.0
  13. else rxlv.actrows = rxlv.disprows
  14.  
  15. /* Get current mouse coordinates */
  16. call forbid
  17. screen = next(rxlv.intui, 56)                         /* IntuitionBase->ActiveScreen */
  18. mousex = c2d(import(offset(screen, 18), 2)) - 50      /* Screen->MouseX */
  19. mousey = c2d(import(offset(screen, 16), 2)) - 50      /* Screen->MouseY */
  20. call permit
  21.  
  22. /* Open the listview */
  23. call open(rxlv.win, 'RAW:'mousex'/'mousey'/'rxlv.width'/'rxlv.height'/'titletxt'/NOSIZE', 'w')
  24. call writech(rxlv.win, rxlv.nocursor||rxlv.nowordwrap)
  25.  
  26. /* Initialize window */
  27. if viewline.0 > 0 then do
  28.     rxlv.row = 1 
  29.     rxlv.var = 1
  30.     rxlv.topvar = 1 
  31.     call writech(rxlv.win, rxlv_getlighty(rxlv.row, rxlv.var)||rxlv.nl||rxlv_getpage(rxlv.var + 1))
  32. end
  33.  
  34. /* Do ze stuff */
  35. do forever
  36.     rxlv.oldrow = rxlv.row 
  37.     rxlv.oldvar = rxlv.var
  38.  
  39.     char = readch(rxlv.win, 1)
  40.     select
  41.         when char = rxlv.csi then do
  42.             char = readch(rxlv.win, 1)
  43.             select
  44.                 when viewline.0 < 2 then nop
  45.                 when char = rxlv.cursordown then do
  46.                     if rxlv.oldvar ~= viewline.0 then do
  47.                         line = rxlv_getunlighty()
  48.                         rxlv.var = rxlv.var + 1
  49.  
  50.                         if rxlv.oldrow < rxlv.actrows then rxlv.row = rxlv.row + 1 
  51.                         else do
  52.                             line = line||rxlv.nl
  53.                             rxlv.row = rxlv.actrows
  54.                             rxlv.topvar = rxlv.topvar + 1
  55.                         end
  56.                         call writech(rxlv.win, line||rxlv_getlighty())
  57.                     end
  58.                     else call rxlv_top()
  59.                 end  
  60.                 when char = rxlv.cursorup then do
  61.                     if rxlv.oldvar ~= 1 then do
  62.                         line = rxlv_getunlighty()
  63.                         rxlv.var = rxlv.var - 1
  64.  
  65.                         if rxlv.oldrow ~= 1 then do
  66.                             rxlv.row = rxlv.row - 1
  67.                             call writech(rxlv.win, line||rxlv_getlighty())
  68.                         end
  69.                         else do
  70.                             rxlv.row = 1 
  71.                             rxlv.topvar = rxlv.topvar - 1
  72.                             call writech(rxlv.win, line||rxlv_getlighty()||rxlv.nl||rxlv_getpage(rxlv.var + 1))
  73.                         end            
  74.                     end
  75.                     else call rxlv_bottom()                  
  76.                 end
  77.                 when char = rxlv.scursorup then do
  78.                     if rxlv.oldvar ~= 1 then do
  79.                         rxlv.row = 1
  80.                         rxlv.var = rxlv.topvar
  81.  
  82.                         if rxlv.oldrow = 1 then do
  83.                             if rxlv.oldvar - rxlv.actrows < 1 then rxlv.topvar = 1
  84.                             else rxlv.topvar = rxlv.oldvar - rxlv.actrows
  85.                             rxlv.var = rxlv.topvar
  86.                             call writech(rxlv.win, rxlv.cls||rxlv_getlighty()||rxlv.nl||rxlv_getpage(rxlv.topvar + 1))
  87.                         end
  88.                         else call writech(rxlv.win, rxlv_getunlighty()||rxlv_getlighty())
  89.                     end
  90.                     else call rxlv_bottom()                  
  91.                 end
  92.                 when char = rxlv.scursordown then do
  93.                     if rxlv.oldvar ~= viewline.0 then do
  94.                         rxlv.row = rxlv.actrows
  95.  
  96.                         if rxlv.oldrow = rxlv.actrows then do
  97.                             if rxlv.oldvar + rxlv.actrows > viewline.0 then rxlv.topvar = viewline.0 - (rxlv.actrows - 1)
  98.                             else rxlv.topvar = rxlv.oldvar + 1
  99.                             rxlv.var = min(viewline.0, rxlv.topvar + (rxlv.actrows - 1))
  100.                             call writech(rxlv.win, rxlv.cls||rxlv_getpage(rxlv.topvar)||rxlv.nl||rxlv_getlighty())
  101.                         end
  102.                         else do
  103.                             rxlv.var = (rxlv.topvar + rxlv.actrows) - 1
  104.                             call writech(rxlv.win, rxlv_getunlighty()||rxlv_getlighty())
  105.                         end
  106.                     end
  107.                     else call rxlv_top()
  108.                 end
  109.                 otherwise nop
  110.             end
  111.         end
  112.         when char = rxlv.esc then do
  113.             rxlv.key = 'ESC'
  114.             return rxlv_close()
  115.         end
  116.         when char = rxlv.cr then do
  117.             rxlv.key = 'RET'
  118.             return rxlv_close()
  119.         end
  120.         when char = rxlv.del then do
  121.             rxlv.key = 'DEL'
  122.             return rxlv_close()
  123.         end
  124.         when pos(char, inlinechars) > 0 then do
  125.             rxlv.key = char
  126.             return rxlv_close()
  127.         end
  128.         when char = rxlv.help then call rxlv_help()
  129.         otherwise nop
  130.     end
  131. end
  132.  
  133.  
  134. RXLV_CLOSE: procedure expose rxlv. viewline.
  135. call close(rxlv.win)
  136. if viewline.0 = 0 then return 0
  137. return rxlv.oldvar
  138.  
  139.  
  140. RXLV_TOP: procedure expose rxlv. viewline.
  141. rxlv.var = 1
  142. rxlv.row = 1
  143.  
  144. if rxlv.topvar = 1 then do   /* Just move to top */
  145.     line = rxlv_getunlighty()
  146.     call writech(rxlv.win, line||rxlv_getlighty())
  147. end
  148. else do
  149.     rxlv.topvar = 1
  150.     call writech(rxlv.win, rxlv.cls||rxlv_getlighty()||rxlv.nl||rxlv_getpage(rxlv.var + 1))
  151. end
  152. return
  153.  
  154.  
  155. RXLV_BOTTOM: procedure expose rxlv. viewline.
  156. rxlv.var = viewline.0
  157.  
  158. if viewline.0 <= rxlv.actrows then do 
  159.     line = rxlv_getunlighty()
  160.     rxlv.row = viewline.0
  161.     call writech(rxlv.win, line||rxlv_getlighty())
  162. end
  163. else do
  164.     rxlv.row = rxlv.actrows
  165.     rxlv.topvar = (viewline.0 - rxlv.actrows) + 1
  166.     call writech(rxlv.win, rxlv.cls||rxlv_getpage(rxlv.topvar)||rxlv.nl||rxlv_getlighty())
  167. end
  168. return
  169.  
  170.  
  171. RXLV_GETPAGE: procedure expose viewline. rxlv.
  172. if viewline.0 = 1 then return ''
  173.  
  174. top = arg(1)
  175. page = ''
  176. do y = 1 to rxlv.actrows - 2                    /* Lines between first and last */
  177.     page = page||viewline.top||rxlv.nl
  178.     top = top + 1
  179. end 
  180. page = page||viewline.top                       /* No newline after last line */
  181. return page
  182.  
  183.  
  184. RXLV_GETUNLIGHTY: procedure expose rxlv. viewline. 
  185. var = rxlv.oldvar
  186. return rxlv.csi||rxlv.oldrow'H'viewline.var
  187.  
  188.  
  189. RXLV_GETLIGHTY: procedure expose rxlv. viewline. 
  190. var = rxlv.var
  191. return rxlv.csi||rxlv.row'H'rxlv.hilite||viewline.var||rxlv.off
  192.  
  193.  
  194. RXLV_INIT: procedure expose rxlv.
  195. /* Hardcoded minimum values */
  196. rxlv.width = max(100, rxlv.width)
  197. rxlv.height = max(50, rxlv.height)
  198.  
  199. /* ANSI stuff */
  200. rxlv.csi = '9b'x  ; rxlv.esc = '1b'x
  201. rxlv.help = '7e'x ; rxlv.del = '7f'x
  202. rxlv.nl = '0a'x   ; rxlv.cr = '0d'x
  203. rxlv.off = rxlv.csi||'0m' 
  204. rxlv.topleft = rxlv.csi'48'x 
  205. rxlv.cls = rxlv.csi'H'rxlv.csi'J'
  206. rxlv.hilite = rxlv.csi'43;32m'
  207. rxlv.nowordwrap = rxlv.csi||'3f376c'x
  208. rxlv.nocursor = rxlv.csi||'302070'x 
  209. rxlv.cursorup = '41'x  ; rxlv.cursordown = '42'x 
  210. rxlv.scursorup = '54'x ; rxlv.scursordown = '53'x
  211. rxlv.win = 'listwin'
  212.  
  213. /* GUI constants */
  214. guiheight = 7 ; guiwidth = 8
  215.  
  216. /* Font info */
  217. rxlv.intui = showlist(l, 'intuition.library',, a)
  218. call forbid
  219. screen = next(rxlv.intui, 56)               /* IntuitionBase->ActiveScreen */
  220. font = next(screen, 136)                    /* Screen->RastPort.Font */
  221. fonty = c2d(import(offset(font, 20), 2))    /* Font->YSize */
  222. fontx = c2d(import(offset(font, 24), 2))    /* Font->XSize */
  223. call permit
  224.  
  225. /* Listview width */
  226. do while (rxlv.width - guiwidth) // fontx ~= 0 
  227.     rxlv.width = rxlv.width + 1 
  228. end
  229. rxlv.dispcols = ((rxlv.width - guiwidth) % fontx)
  230. rxlv.filler = copies(' ', rxlv.dispcols)
  231.  
  232. /* Listview height */
  233. const = guiheight + fonty
  234. do while (rxlv.height - const) // fonty ~= 0 
  235.     rxlv.height = rxlv.height + 1 
  236. end
  237. rxlv.disprows = (rxlv.height - const) % fonty
  238.  
  239. return
  240.